import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class compilador {
 private String urlarchivo; 
 private xml reader;
 private String validdatatype;
 private tabla stabla;
 private boolean lenguaje;
 private boolean omitir;
 private Pattern patt; 
 private Matcher matc;
 private String error;
 public compilador(){
  lenguaje=false;
  matc=null;
  patt=null;
  omitir=false;
 }
 protected Object[] compilar(int fase,String expresion){
  boolean valida=false;
  error=new String("");
  String tipodato="";
  reader=new xml("symbolos.xml");
  String tipobjeto=new String("token");
  switch(fase){
   case 0:
    //Comentarios de una linea
    reader.addFiltro("tipo","comentario");
    reader.addFiltro("name","linea");
    String[] com=reader.obtItems("TOKEN");
    valida=false;
    //omitir=false;
    if(analize(expresion,com[0])==true)
    {
     valida=true;
     //omitir=true;
    }
    tipobjeto=new String("linea");
   break;
   case 1:
    // Analisis de declaracion
    reader.addFiltro("tipo","datatipo");
    String[] srt=reader.obtItems("TOKEN");
    String condiciones=new String("");
    Object[] tmp;
    for(int j=0;j<reader.getLength();j++)
    {
     if(j==0)
     {
      condiciones=condiciones+srt[j];
     }
     else
     {
      condiciones=condiciones+"|"+srt[j];
     }
    } 
    validdatatype=new String(condiciones);
    reader.updFiltro("tipo","declaracion");    
    String[] dec=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","validvar");
    String[] vardec=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","validbeg");
    String[] stx=reader.obtItems("TOKEN");
    if(analize(expresion,dec[0])==true){
     if(analize(expresion,"("+validdatatype+") "+vardec[0])==true){
      valida=true;
     }
    } 
    tipobjeto=new String("declaracion");
   break;
   case 2:
    //Analisis de asignacion
    reader.addFiltro("tipo","asignacion");
    String[] asig=reader.obtItems("TOKEN");
    if(analize(expresion,asig[0])==true)
    {
     valida=true;
    }
    else if(analize(expresion,asig[1])==true){
     valida=true;
    }
    tipobjeto=new String("asignacion");
   break;
   case 3:
    reader.addFiltro("tipo","estructura");
    reader.addFiltro("name","logica");
    String[] estructura=reader.obtItems("TOKEN"); 
    reader.updFiltro("name","while");
    String[] mientras=reader.obtItems("TOKEN");
    reader.updFiltro("name","para");
    String[] para=reader.obtItems("TOKEN");
    //Analisis de estructuras logicas y ciclicas
    if(analize(expresion,estructura[0])==true){
     valida=true;  
     tipobjeto=new String("logica");
    }
    else if(analize(expresion,mientras[0])==true){
     valida=true;
     tipobjeto=new String("while");
    }
    else if(analize(expresion,para[0])==true){
     valida=true;
     tipobjeto=new String("para");
    } 
   break;
   case 4:
    reader.addFiltro("tipo","cierre");
    reader.addFiltro("name","logica");
    String[] cierresi=reader.obtItems("TOKEN");
    reader.updFiltro("name","while");
    String[] cierremientras=reader.obtItems("TOKEN");
    reader.updFiltro("name","para");
    String[] cierrepara=reader.obtItems("TOKEN");
    if(analize(expresion,cierresi[0])==true){
     valida=true;
     tipobjeto=new String("logica");
    }
    else if(analize(expresion,cierremientras[0])==true){
     valida=true;
     tipobjeto=new String("while");
    }
    else if(analize(expresion,cierrepara[0])==true){
     valida=true;
     tipobjeto=new String("para");
    }
   break;
   case 5:
    reader.addFiltro("item","tipovalido");
    reader.addFiltro("tipo","caracter");
    String[] caracter=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","entero");
    String[] entero=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","flotante");
    String[] flotante=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","booleano");
    String[] booleano=reader.obtItems("TOKEN");
    reader.updFiltro("tipo","cadena");
    String[] cadena=reader.obtItems("TOKEN");
    //Analisis de estructuras logicas y ciclicas
    if(analize(expresion,caracter[0])==true){
     valida=true;
     tipobjeto=new String("caracter");
     //System.out.println("caracter");
    }
    else if(analize(expresion,entero[0])==true){
     valida=true;
     tipobjeto=new String("entero");
     //System.out.println("entero");
    }
    else if(analize(expresion,flotante[0])==true){
     valida=true;
     tipobjeto=new String("flotante");
     //System.out.println("flotante");
    }
    else if(analize(expresion,booleano[0])==true){
     valida=true;
     tipobjeto=new String("booleano");
     //System.out.println("booleano");
    }
    else if(analize(expresion,cadena[0])==true){
     valida=true;
     tipobjeto=new String("cadena");
     //System.out.println("cadena");
    }
   break;
   default:
    //Comentarios para multiples lineas
    if(omitir==true)
    {
     valida=true;
     reader.addFiltro("name","finmultilinea");
     reader.addFiltro("tipo","comentario");
    }
    else
    {
     reader.addFiltro("tipo","comentario");
     reader.addFiltro("name","multilinea");
     String[] comm=reader.obtItems("TOKEN");
     if(analize(expresion,comm[0])==true){
      valida=true;
      omitir=true;
     }
     else
     {
      omitir=false;
     }
     reader.updFiltro("name","finmultilinea");
     reader.updFiltro("tipo","comentario");
    }
   
    //Identificar fin de comentario
    String[] commm=reader.obtItems("TOKEN");
    if(analize(expresion,commm[0])==true){
     omitir=false;
     error=null;
    }
    tipobjeto=new String("multilinea");
   break;
  }
  return new Object[]{valida,error,tipobjeto};
 }
 protected Object[] obtVars(String declaracion){
  String subdato=declaracion;
  String linea="";
  String vars="";
  String[] Vars=new String[500];
  int cVars=-1;
  while(subdato.indexOf(";")!=-1){
   linea=subdato.substring(0,subdato.indexOf(";")+1);
   vars=linea.substring(linea.indexOf(" ")+1,linea.indexOf(";"));
   if(linea.indexOf(",")==-1){
    cVars++;
    Vars[cVars]=new String(vars);
   }
   else
   {
    while(vars.indexOf(",")!=-1){
     cVars++;
     Vars[cVars]=new String(vars.substring(0,vars.indexOf(",")));
     vars=vars.substring(vars.indexOf(",")+1,vars.length());
    }
   }
   subdato=subdato.substring(subdato.indexOf(";")+1,subdato.length());
  }
  String datatype=declaracion.substring(0,declaracion.indexOf(" "));
  return new Object[]{datatype,cVars+1,Vars};
 }
 protected boolean analize(String exp,String token)
 {   
  try{
      patt=Pattern.compile(token);
      matc=patt.matcher(exp);
      if(matc.find()){
       return true;
       //omitir=true;
      }
      else
      {
       String[] errors=patt.split(exp);
        for(String s : errors){
         error=s;
       }
       //omitir=false;
      }
     } catch(Exception e){
      e.printStackTrace();
  }
  return false;
 } 
 protected void cargarTabla(tabla t){
  stabla=t; 
 }
}
